package main

import (
	"image"
	"image/color"
	"image/jpeg"
	"log"
	"os"
)

// 计算颜色的差异// 计算颜色的差异
func colorDiff(c1, c2 color.Color) bool {
	r1, g1, b1, _ := c1.RGBA()
	r2, g2, b2, _ := c2.RGBA()
	// 这里简单判断颜色差异是否超过一定阈值，可根据实际情况调整
	diff := (r1 > r2 && r1-r2 > 10000) || (r2 > r1 && r2-r1 > 10000) ||
		(g1 > g2 && g1-g2 > 10000) || (g2 > g1 && g2-g1 > 10000) ||
		(b1 > b2 && b1-b2 > 10000) || (b2 > b1 && b2-b1 > 10000)
	return diff
}

// 根据原颜色亮度和橙黄色混合生成新颜色
func blendWithOrangeYellow(c color.Color, orangeYellow color.RGBA) color.RGBA {
	r, g, b, _ := c.RGBA()
	r = r >> 8
	g = g >> 8
	b = b >> 8
	// 计算原颜色的亮度
	brightness := 0.299*float64(r) + 0.587*float64(g) + 0.114*float64(b)
	// 根据亮度调整橙黄色的混合比例
	ratio := brightness / 255.0
	newR := uint8(float64(orangeYellow.R)*ratio + float64(r)*(1-ratio))
	newG := uint8(float64(orangeYellow.G)*ratio + float64(g)*(1-ratio))
	newB := uint8(float64(orangeYellow.B)*ratio + float64(b)*(1-ratio))
	return color.RGBA{newR, newG, newB, 255}
}

func main() {
	// 打开第一张图片
	file1, err := os.Open("image1.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer file1.Close()

	img1, _, err := image.Decode(file1)
	if err != nil {
		log.Fatal(err)
	}

	// 打开第二张图片
	file2, err := os.Open("image2.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer file2.Close()

	img2, _, err := image.Decode(file2)
	if err != nil {
		log.Fatal(err)
	}

	// 创建一个新的图片用于保存结果
	bounds := img1.Bounds()
	result := image.NewRGBA(bounds)

	// 橙黄色
	orangeYellow := color.RGBA{255, 165, 0, 255}

	// 遍历图片的每个像素
	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
		for x := bounds.Min.X; x < bounds.Max.X; x++ {
			c1 := img1.At(x, y)
			c2 := img2.At(x, y)
			if colorDiff(c1, c2) {
				newColor := blendWithOrangeYellow(c1, orangeYellow)
				result.Set(x, y, newColor)
			} else {
				result.Set(x, y, c1)
			}
		}
	}

	// 保存结果图片
	outputFile, err := os.Create("result.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer outputFile.Close()

	err = jpeg.Encode(outputFile, result, &jpeg.Options{Quality: 90})
	if err != nil {
		log.Fatal(err)
	}

	log.Println("处理完成，结果保存为 result.jpg")
}
